package com.bos.report.factory;

import com.bos.dao.AnggaranDAO;
import com.bos.dao.KecamatanDAO;
import com.bos.domain.Anggaran;
import com.bos.domain.Kecamatan;
import com.bos.domain.Periode;
import com.bos.report.model.DanaBosKecamatan;
import com.bos.util.enums.JenjangSekolah;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by IntelliJ IDEA.
 * User: Latief
 * Date: 5/30/11
 * Time: 2:58 PM
 * To change this template use File | Settings | File Templates.
 */
@Repository
public class DanaBosKecamatanFactory extends ReportFactory<DanaBosKecamatan> {

    public final static String KEY_JENJANG_SEKOLAH = "danaBosJenjangSekolah";
    public final static String KEY_PERIODE = "danaBosPeriode";

    private KecamatanDAO kecamatanDAO;
    private AnggaranDAO anggaranDAO;

    public DanaBosKecamatanFactory() {
        super();
    }

    @Autowired
    public void setKecamatanDAO(KecamatanDAO kecamatanDAO) {
        this.kecamatanDAO = kecamatanDAO;
    }

    @Autowired
    public void setAnggaranDAO(AnggaranDAO anggaranDAO) {
        this.anggaranDAO = anggaranDAO;
    }

    protected List<Kecamatan> loadReferenceDataSource(long kabupatenId) {
        return kecamatanDAO.getByKabupatenId(kabupatenId);
    }

    protected Map<Long, DanaBosKecamatan> mappingReferenceDataSource(long kabupatenId) {
        List<Kecamatan> kecamatansReference = loadReferenceDataSource(kabupatenId);

        Map<Long, DanaBosKecamatan> mapDataSource = new HashMap<Long, DanaBosKecamatan>();
        for (Kecamatan kecamatan : kecamatansReference) {
            DanaBosKecamatan danaBosKecamatan = new DanaBosKecamatan();
            danaBosKecamatan.setNamaKecamatan(kecamatan.getNama());
            danaBosKecamatan.setDana(0);

            mapDataSource.put(kecamatan.getId(), danaBosKecamatan);
        }

        return mapDataSource;
    }

    /**
     * Konversikan mapping data source ke dalam List datasource.
     *
     * @param mapDataSource
     */
    protected void convertMapDataSourceToDataSource(Map<Long, DanaBosKecamatan> mapDataSource) {
        dataSource = new ArrayList<DanaBosKecamatan>();

        if (mapDataSource == null)
            return;

        //Konversikan ke List data source
        dataSource.addAll(mapDataSource.values());
    }

    public void fillDataSource(JenjangSekolah jenjangSekolah, Periode periode, long kabupatenId, List<Anggaran> anggarans) {
        Map<Long, DanaBosKecamatan> mapDataSource = new HashMap<Long, DanaBosKecamatan>();

        if (jenjangSekolah != null || periode != null) {
            putResponseParameter(KEY_JENJANG_SEKOLAH, jenjangSekolah);
            putResponseParameter(KEY_PERIODE, periode.getTriwulan() + " " + periode.getTahun());

            mapDataSource.putAll(mappingReferenceDataSource(kabupatenId));

            if(anggarans != null){
                for(Anggaran anggaran:anggarans){
                    long kecamatanId = anggaran.getSekolah().getKelurahan().getKecamatan().getId();
                    long dana = mapDataSource.get(kecamatanId).getDana();
                    dana = dana + anggaran.getKucuran();
                    mapDataSource.get(kecamatanId).setDana(dana);
                }
            }
        }

        convertMapDataSourceToDataSource(mapDataSource);
    }
}
